package day2.jicheng2;
//就近原则
//方法重写 要求方法名字形参完全一样，权限：子类方法权限大于等于父类的被重写方法的权限。返回值：父类的大于等于子类的，你可以返回父类的儿子
//重写的时候加一个@overrid标识符
//重写的意义就是在某一个子类，父类中的方法不符合我的要求了就重写,静态方法和私有方法不让重写
//一般会用来重写子类的toString满足自己的输出
//创建子类对象先调用父类的无参构造器（默认），除非+super（参数）
public class test
{
    public static void main(String[] args) {
        b b1=new b();
        b1.show();
        a a1=new a();
        System.out.println(a1);//你直接打印a1应该打的是地址，原型是a1.toString（）继承Object，我在a中给他重写了



    }
}
class a extends Object
{
    private String id;
    private char sex;
    private int age;
    private String school;
    public a()
    {
        System.out.println("fu无参构造器");
    }

    public a(String id, char sex, int age) {
       this(id,sex,age,"清华大学");/*在这个构造函数体内，它调用了另一个构造函数（通过this关键字），
                                         传递了前面三个参数以及一个额外的参数"清华大学"（类型为String）。
                                         和super一样必须在第一行而且两者不能同时在第一行*/
    }
    public a(String id, char sex, int age, String school) {

        this.id = id;
        this.sex = sex;
        this.age = age;
        this.school = school;
    }

    public a(int number)
    {
        System.out.println("fu有参构造器");
    }
    String name="王帅";
    /*public void run()
    {
        System.out.println("hello");
    }
    */
    public void run(){}

    @Override
    public String toString()
    {
       return "helloworld";
    }
}
class b extends a
{
    public b()
    {
        //默认有一个super()
        super(500);//调用父的有参构造器
        System.out.println("zi无参构造器");
    }
    public b(int number)
    {
        System.out.println("zi有参构造器");
    }
 String name="小王";

    public String getName() {
        return name;
    }
@Override
    public void run()
 {
     System.out.println("helloworld");
 }

    public void show()
 {
     String name="小王王";
     System.out.println(name);//局部变量
     System.out.println(this.name);//成员（子类）变量
     System.out.println(super.name);//成员（父类）变量
     System.out.println(((a) this).name);//把this对象（子类）强制转换成父类，然后输出父类的name
 }
}
class c extends b
{
String name="小汪汪";


}